package org.gwt.server.redes;
import smile.Network;

public class NetBuilder {
	
	private Network net;
	public NetBuilder(int which) {
		net = new Network();
		
		switch (which){
			case 1:
				buildProblem1Network();
			break;
			case 2:
				buildProblem2Network();
			break;
			case 3:
				buildProblem3Network();				
			break;
		
		}
		
	}
	void buildProblem1Network(){
		System.out.println("Construyendo red problema1");
	}
	void buildProblem2Network(){
		System.out.println("Construyendo red problema2");
		
	}
	
	private void buildProblem3Network() {
		System.out.println("Construyendo red problema3");
		
		net.addNode(Network.NodeType.Cpt, "OP_Encontrar_ecuacion_del_plano");
		net.setOutcomeId("OP_Encontrar_ecuacion_del_plano", 0, "TRUE");
		net.setOutcomeId("OP_Encontrar_ecuacion_del_plano", 1, "FALSE");

		net.addNode(Network.NodeType.Cpt,"RC_Intentar_ecuacion_normal_del_plano");
		net.setOutcomeId("RC_Intentar_ecuacion_normal_del_plano", 0, "TRUE");
		net.setOutcomeId("RC_Intentar_ecuacion_normal_del_plano", 1, "FALSE");

		//OP_Encontrar_ecuacion_del_plano
		net.addNode(Network.NodeType.Cpt,"AR_Intentar_ecuacion_normal_del_plano");
		net.setOutcomeId("AR_Intentar_ecuacion_normal_del_plano", 0, "TRUE");
		net.setOutcomeId("AR_Intentar_ecuacion_normal_del_plano", 1, "FALSE");
		
		//AR_Intentar_ecuacion_normal_del_plano
		net.addNode(Network.NodeType.Cpt,"O_Intentar_ecuacion_normal_del_plano");
		net.setOutcomeId("O_Intentar_ecuacion_normal_del_plano", 0, "TRUE");
		net.setOutcomeId("O_Intentar_ecuacion_normal_del_plano", 1, "FALSE");

		net.addNode(Network.NodeType.Cpt,"RC_Definir_vectores_ecuacion_normal_plano");
		net.setOutcomeId("RC_Definir_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("RC_Definir_vectores_ecuacion_normal_plano", 1, "FALSE");		
		
		//O_Intentar_ecuacion_normal_del_plano
		net.addNode(Network.NodeType.Cpt,"AR_Definir_vectores_ecuacion_normal_plano");
		net.setOutcomeId("AR_Definir_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("AR_Definir_vectores_ecuacion_normal_plano", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt,"RC_Relacionar_vectores_ecuacion_normal_plano");
		net.setOutcomeId("RC_Relacionar_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("RC_Relacionar_vectores_ecuacion_normal_plano", 1, "FALSE");		
		
		//O_Intentar_ecuacion_normal_del_plano		
		net.addNode(Network.NodeType.Cpt,"AR_Relacionar_vectores_ecuacion_normal_plano");
		net.setOutcomeId("AR_Relacionar_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("AR_Relacionar_vectores_ecuacion_normal_plano", 1, "FALSE");
		
		//AR_Definir_vectores_ecuacion_normal_plano
		net.addNode(Network.NodeType.Cpt,"O_Definir_vectores_ecuacion_normal_plano");
		net.setOutcomeId("O_Definir_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("O_Definir_vectores_ecuacion_normal_plano", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt, "RC_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 0, "TRUE");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt, "RC_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 0, "TRUE");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt, "RC_Definir_un_vector_normal_a_un_plano");
		net.setOutcomeId("RC_Definir_un_vector_normal_a_un_plano", 0, "TRUE");
		net.setOutcomeId("RC_Definir_un_vector_normal_a_un_plano", 1, "FALSE");
		
		//O_Definir_vectores_ecuacion_normal_plano
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano"); 
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_normal_a_un_plano");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 1, "FALSE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 1, "FALSE");
		net.setOutcomeId("AR_Definir_un_vector_normal_a_un_plano", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_normal_a_un_plano", 1, "FALSE");

		//AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano
		net.addNode(Network.NodeType.Cpt, "O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano");
		net.setOutcomeId("O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 0, "TRUE");
		net.setOutcomeId("O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano", 1, "FALSE");

		//AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano
		net.addNode(Network.NodeType.Cpt, "O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");
		net.setOutcomeId("O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 0, "TRUE");
		net.setOutcomeId("O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano", 1, "FALSE");

		//AR_Definir_un_vector_normal_a_un_plano
		net.addNode(Network.NodeType.Cpt, "O_Definir_un_vector_normal_a_un_plano");
		net.setOutcomeId("O_Definir_un_vector_normal_a_un_plano", 0, "TRUE");
		net.setOutcomeId("O_Definir_un_vector_normal_a_un_plano", 1, "FALSE");

		net.addNode(Network.NodeType.Cpt, "RC_Definir_un_vector_de_posicion_r3");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_r3", 0, "TRUE");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_r3", 1, "FALSE");
		
		//O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_de_posicion_r3_p");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_r3_p", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_r3_p", 1, "FALSE");
		net.setNodeName("AR_Definir_un_vector_de_posicion_r3_p","AR_Definir_un_vector_de_posicion_r3");
		
		net.addNode(Network.NodeType.Cpt, "RC_Definir_un_vector_de_posicion_tipico_r3");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_tipico_r3", 0, "TRUE");
		net.setOutcomeId("RC_Definir_un_vector_de_posicion_tipico_r3", 1, "FALSE");		
		
		//O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_de_posicion_tipico_r3");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_tipico_r3", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_tipico_r3", 1, "FALSE");
		
		//O_Definir_un_vector_normal_a_un_plano //tiene como padre a la misma RC que el nodo AR_Definir_un_vector_de_posicion_r3_p
		net.addNode(Network.NodeType.Cpt, "AR_Definir_un_vector_de_posicion_r3_n");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_r3_n", 0, "TRUE");
		net.setOutcomeId("AR_Definir_un_vector_de_posicion_r3_n", 1, "FALSE");
		net.setNodeName("AR_Definir_un_vector_de_posicion_r3_n","AR_Definir_un_vector_de_posicion_r3");
		
		//AR_Definir_un_vector_de_posicion_r3_p
		net.addNode(Network.NodeType.Cpt, "H_Vp_es_el_vector_de_posicion_del_punto_dentro_del_plano");
		net.setOutcomeId("H_Vp_es_el_vector_de_posicion_del_punto_dentro_del_plano", 0, "TRUE");
		net.setOutcomeId("H_Vp_es_el_vector_de_posicion_del_punto_dentro_del_plano", 1, "FALSE");
		net.setNodeName("H_Vp_es_el_vector_de_posicion_del_punto_dentro_del_plano","Vp=(1,1,1)");

		//AR_Definir_un_vector_de_posicion_tipico_r3
		net.addNode(Network.NodeType.Cpt, "H_Vd_es_un_vector_de_posicion_del_punto_tipico_del_plano");
		net.setOutcomeId("H_Vd_es_un_vector_de_posicion_del_punto_tipico_del_plano", 0, "TRUE");
		net.setOutcomeId("H_Vd_es_un_vector_de_posicion_del_punto_tipico_del_plano", 1, "FALSE");
		net.setNodeName("H_Vd_es_un_vector_de_posicion_del_punto_tipico_del_plano","Vd=(x,y,z)");
		
		//AR_Definir_un_vector_de_posicion_r3_n
		net.addNode(Network.NodeType.Cpt, "H_Vn_es_un_vector_normal_al_plano");
		net.setOutcomeId("H_Vn_es_un_vector_normal_al_plano", 0, "TRUE");
		net.setOutcomeId("H_Vn_es_un_vector_normal_al_plano", 1, "FALSE");
		net.setNodeName("H_Vn_es_un_vector_normal_al_plano","Vn=(1,2,3)");
		
		//AR_Relacionar_vectores_ecuacion_normal_plano
		net.addNode(Network.NodeType.Cpt, "O_Relacionar_vectores_ecuacion_normal_plano");
		net.setOutcomeId("O_Relacionar_vectores_ecuacion_normal_plano", 0, "TRUE");
		net.setOutcomeId("O_Relacionar_vectores_ecuacion_normal_plano", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt, "RC_Probar_Ortogonalidad_dos_vectores");
		net.setOutcomeId("RC_Probar_Ortogonalidad_dos_vectores", 0, "TRUE");
		net.setOutcomeId("RC_Probar_Ortogonalidad_dos_vectores", 1, "FALSE");
		
		//O_Relacionar_vectores_ecuacion_normal
		net.addNode(Network.NodeType.Cpt, "AR_Probar_Ortogonalidad_dos_vectores");
		net.setOutcomeId("AR_Probar_Ortogonalidad_dos_vectores", 0, "TRUE");
		net.setOutcomeId("AR_Probar_Ortogonalidad_dos_vectores", 1, "FALSE");

		//AR_Probar_Ortogonalidad_dos_vectores
		net.addNode(Network.NodeType.Cpt, "O_Probar_Ortogonalidad");
		net.setOutcomeId("O_Probar_Ortogonalidad", 0, "TRUE");
		net.setOutcomeId("O_Probar_Ortogonalidad", 1, "FALSE");
		
		net.addNode(Network.NodeType.Cpt, "RC_Producto_escalar");
		net.setOutcomeId("RC_Producto_escalar", 0, "TRUE");
		net.setOutcomeId("RC_Producto_escalar", 1, "FALSE");
				
		//O_Probar_Ortogonalidad
		net.addNode(Network.NodeType.Cpt, "AR_Producto_escalar");
		net.setOutcomeId("AR_Producto_escalar", 0, "TRUE");
		net.setOutcomeId("AR_Producto_escalar", 1, "FALSE");
		
		//AR_Producto_escalar
		net.addNode(Network.NodeType.Cpt, "H_Ecuacion_Producto_Vectorial");
		net.setOutcomeId("H_Ecuacion_Producto_Vectorial", 0, "TRUE");
		net.setOutcomeId("H_Ecuacion_Producto_Vectorial", 1, "FALSE");
		net.setNodeName("H_Ecuacion_Producto_Vectorial","(Vd-Vp).Vn=0");

		net.addArc("OP_Encontrar_ecuacion_del_plano", "AR_Intentar_ecuacion_normal_del_plano");
		
		net.addArc("AR_Intentar_ecuacion_normal_del_plano","O_Intentar_ecuacion_normal_del_plano");
		
		net.addArc("O_Intentar_ecuacion_normal_del_plano","AR_Definir_vectores_ecuacion_normal_plano");
		net.addArc("O_Intentar_ecuacion_normal_del_plano","AR_Relacionar_vectores_ecuacion_normal_plano");
		
		net.addArc("AR_Definir_vectores_ecuacion_normal_plano","O_Definir_vectores_ecuacion_normal_plano");
		
		net.addArc("O_Definir_vectores_ecuacion_normal_plano","AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano");		
		net.addArc("O_Definir_vectores_ecuacion_normal_plano","AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");		
		net.addArc("O_Definir_vectores_ecuacion_normal_plano","AR_Definir_un_vector_normal_a_un_plano");
			
		net.addArc("AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano","O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano");
		
		net.addArc("AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano","O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");
		
		net.addArc("AR_Definir_un_vector_normal_a_un_plano","O_Definir_un_vector_normal_a_un_plano");
		
		net.addArc("O_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano","AR_Definir_un_vector_de_posicion_r3_p");
		
		net.addArc("O_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano","AR_Definir_un_vector_de_posicion_tipico_r3");
		
		net.addArc("O_Definir_un_vector_normal_a_un_plano","AR_Definir_un_vector_de_posicion_r3_n");
		
		net.addArc("AR_Definir_un_vector_de_posicion_r3_p","H_Vp_es_el_vector_de_posicion_del_punto_dentro_del_plano");
		
		net.addArc("AR_Definir_un_vector_de_posicion_tipico_r3","H_Vd_es_un_vector_de_posicion_del_punto_tipico_del_plano");
		
		net.addArc("AR_Definir_un_vector_de_posicion_r3_n","H_Vn_es_un_vector_normal_al_plano");
		
		//
		
		net.addArc("AR_Relacionar_vectores_ecuacion_normal_plano","O_Relacionar_vectores_ecuacion_normal_plano");
		
		net.addArc("O_Relacionar_vectores_ecuacion_normal_plano","AR_Probar_Ortogonalidad_dos_vectores");
		
		net.addArc("AR_Probar_Ortogonalidad_dos_vectores","O_Probar_Ortogonalidad");
		
		net.addArc("O_Probar_Ortogonalidad","AR_Producto_escalar");
		
		net.addArc("AR_Producto_escalar","H_Ecuacion_Producto_Vectorial");
		
		//
		
		net.addArc("RC_Intentar_ecuacion_normal_del_plano","AR_Intentar_ecuacion_normal_del_plano");
		net.addArc("RC_Definir_vectores_ecuacion_normal_plano","AR_Definir_vectores_ecuacion_normal_plano");
		net.addArc("RC_Relacionar_vectores_ecuacion_normal_plano","AR_Relacionar_vectores_ecuacion_normal_plano");
		net.addArc("RC_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano","AR_Definir_un_vector_de_posicion_de_un_punto_dentro_de_un_plano");
		net.addArc("RC_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano","AR_Definir_un_vector_de_posicion_de_un_punto_tipico_de_un_plano");
		net.addArc("RC_Definir_un_vector_normal_a_un_plano","AR_Definir_un_vector_normal_a_un_plano");
		net.addArc("RC_Definir_un_vector_de_posicion_r3","AR_Definir_un_vector_de_posicion_r3_p");
		net.addArc("RC_Definir_un_vector_de_posicion_tipico_r3","AR_Definir_un_vector_de_posicion_tipico_r3");
		net.addArc("RC_Definir_un_vector_de_posicion_r3","AR_Definir_un_vector_de_posicion_r3_n");
		net.addArc("RC_Probar_Ortogonalidad_dos_vectores","AR_Probar_Ortogonalidad_dos_vectores");
		net.addArc("RC_Producto_escalar","AR_Producto_escalar");		

//		net.setNodePosition("GP_Encontrar_ecuacion_del_plano", 200, 20, 80, 30);
//		net.setNodeBgColor("GP_Encontrar_ecuacion_del_plano", Color.red);
//		net.setNodeTextColor("GP_Encontrar_ecuacion_del_plano", Color.white);
//		net.setNodeBorderColor("GP_Encontrar_ecuacion_del_plano", Color.black);
//		net.setNodeBorderWidth("GP_Encontrar_ecuacion_del_plano", 2);
//		net.setNodePosition("RA_Definicion_de_un_plano", 200, 50, 60, 30);
//		net.setNodePosition("G_Definir_Elementos_Determinantes", 100, 80, 60, 30);
//		net.setNodePosition("G_Elegir_Definicion_a_Usar", 30, 100, 60, 30);
//		net.setNodePosition("S_Estrategia_para_elegir_definicion", 30, 100, 60, 30);
//		net.setNodePosition("G_Definir_un_punto_dentro_de_un_plano", 30, 100, 60, 30);
//		net.setNodePosition("G_Definir_un_vector_normal_a_un_plano", 30, 100, 60, 30);
//		net.setNodePosition("G_Definir_un_punto_tipico_de_un_plano", 30, 100, 60, 30);
//		net.setNodePosition("F_Vp_es_el_vector_hacia_el_punto_dentro_del_plano", 30, 100, 60, 30);
//		net.setNodePosition("F_Vn_es_un_vector_normal_al_plano", 30, 100, 60, 30);
//		net.setNodePosition("F_Vd_es_un_vector_hacia_el_punto_tipico_del_plano", 30, 100, 60, 30);
//		net.setNodePosition("RA_Ecuacion_General_del_Plano", 30, 100, 60, 30);
//		net.setNodePosition("RA_Ortogonalidad_de_dos_vectores", 30, 100, 60, 30);
//		net.setNodePosition("G_Escribir_ecuacion_general_del_plano", 30, 100, 60, 30);
//		net.setNodePosition("G_Probar_Ortogonalidad", 30, 100, 60, 30);
//		net.setNodePosition("F_Ecuacion", 30, 100, 60, 30);
//		net.setNodePosition("RA_Producto_escalar", 30, 100, 60, 30);
//		net.setNodePosition("G_Obtener_el_producto_escalar_de_dos_vectores", 30, 100, 60, 30);
//		net.setNodePosition("F_Ecuacion_Vectorial", 30, 100, 60, 30);
//		
		/*
		 * Ahora hay que definir la distrubucion del nodo "Forecast" condicionado al Nodo "Success".
		 * En este caso tendremos una matriz de dos dimensiones: una para los estados del padre ("Success")
		 * y otro para los estados del hijo ("Forecast"). Las probabilidades son:
		 * 
		 * P("Forecast" = Good | "Success" = Success) = 0.4
		 * P("Forecast" = Moderate | "Success" = Success) = 0.4
		 * P("Forecast" = Poor | "Success" = Success) = 0.2
		 * P("Forecast" = Good | "Success" = Failure) = 0.1
		 * P("Forecast" = Moderate | "Success" = Failure) = 0.3
		 * P("Forecast" = Poor | "Success" = Failure) = 0.6
		 * 
		 * El orden de los valores depende considerando el Estado del primer padre del nodo como la
		 * ubicacion mas significativa (en teminos de bits), despues el segundo padre, luego el tercer
		 * y asi sucesivamente; considerando al final la coordenada del Nodo mismo como la menos
		 * significativa 
		 * */
		 //double[] GP_Encontrar_ecuacion_del_planoDef = {0.99, 0.01}; 
		 //net.setNodeDefinition("GP_Encontrar_ecuacion_del_plano",GP_Encontrar_ecuacion_del_planoDef);
		 
		 //double[] RC_Definicion_de_un_planoDef = {0.5, 0.5}; //RC Datos de los examenes*  
		 //net.setNodeDefinition("RC_Definicion_de_un_plano",RC_Definicion_de_un_planoDef);

		
	}
	
	public Network getNetwork(){
		return net;
	}

}
